<?php
#创建Controller文件 #php artisan make:controller控制器名(大驼峰) Controller 关键词
#终端执行 php artisan make:controller TestController
namespace App\Http\Controllers;

use Illuminate\Http\Request; //命名空间的三元素:常量、方法、类
use Illuminate\Support\Facades\Input; //接收用户输入的类  Input
use Illuminate\Support\Facades\DB; //引入DB门面
use App\Home\Member; //引入模型
use Illuminate\Support\Facades\Session; //引入 Session
use Illuminate\Support\Facades\Cache; //引入Cache

class TestController extends Controller
{
    //测试控制器路由的使用
    public function test1()
    {
        //输出任意信息
        phpinfo();
    }
    //test2测试input获取数据
    public function test2()
    {
        //获取第二个值 如果没有则使用第二个参数当默认值
        echo Input::get('id', '10086', '<br>');
        //获取全部的值，（数组形式返回）
        $all = Input::all();
        // dd($all);
        //获取指定的信息 (字符串形式)
        //dd(Input::get('name'));
        //获取指定的几个值 (数组形式)
        //dd(Input::only(['id', 'name']));
        //获取指定的值，之外的值 (数组形式)
        dd(Input::except(['id',]));
    }
    //添加方法
    public function add()
    {
        //定义关联操作的表
        $db = DB::table('member');
        //使用 insert 增加查询记录 insert加入一条或多条  insertGetId 只能加入一条
        $result = $db->insert([
            [
                'name' => '马冬33梅',
                'age' => '18',
                'email' => 'madongmei@qq.com'
            ],
            [
                'name' => '马22炮',
                'age' => '20',
                'email' => 'madapao@qq.com'
            ],
            [
                'name' => '马11炮',
                'age' => '20',
                'email' => 'madapao@qq.com'
            ]
        ]);
        dd($result);
    }
    //数据修改可以使用update()、increment()和 decrement()函数来实现。
    //Update表示可以修改整个记录中的全部字段;
    //Increment和decrement表示修改数字字段的数值(递增或者递诚),典型的应用:记录登录次数、积分的增加:
    public function update()
    {
        //定义需要操作的数据表
        $db = DB::table('member');
        //修改ID为4的用户名为张三丰  < = > 都可以用
        $result =  $db->where('id', '>', '6')->update([
            'name' => '张三丰',
        ]);
        dd($result); //影响行数
    }
    //查询方法
    public function select()
    {
        $db = DB::table('member');
        #查询全部的数据
        $data =  $db->get();
        #循环数据 得到的数据是对象
        foreach ($data as $key => $value) {
            // echo "id是：{$value->id},名字是：{$value->name},邮箱是：{$value->email} <br/>";
        }
        #查询id>6的数据
        // $data =  $db->where('id', '>', '6')->get();
        // dd($data);
        //-> where() -> where() -> where().     这个语法是并且 (and) 关系语法。
        //-> where( -> orWhere() -> orWhere().  这个语法是或者(or) 关系语法。
        // $data1 =  $db->where('age', '>', '30')->get();
        // dd($data1);
        #查询指定的值
        //$data=DB::table('member') ->where('id','1')->value('email' );
        #查询指定的一些字段 select()
        // $data=DB::table('member') ->select('name','email')->get();
        #排序 升序 Asc 倒序 desc 按照指定字段排序
        //$data = DB::table('member')->orderBy('age', 'Asc')->get();
        #分页操作 Limit:表示限制输出的条数 Offset:从什么地方开始 
        $data = DB::table('member')->offset(1)->limit(2)->get();
        dd($data);
    }
    //删除操作
    public function del()
    {
        //定义需要操作的数据表 Delete表示删除记录; Truncate表示清空整个数据表;
        $db = DB::table('member');
        $result =  $db->where('id', '>', '7')->delete();
        dd($result); //影响行数
    }
    /* (1)执行任意的insert update delete语句[影响记录的语句使用statement语法]
            DB:statement("insert into member valuslull,")"); .
        (2)执行任意的select语句[不影响记录的语句使用select 语法]
            Sres = DB::select("select率from member"); */
    #test3
    public function test3()
    {
        #转换上海时区
        date_default_timezone_set("Asia/Shanghai");
        #现在时间
        $date = date('Y-m-d H:i:s', time());
        #获取今天的星期
        $day = '日';
        //传递时间戳 strtotime()将符合时间标准俺的时间转换为时间戳 加一年 year
        $time = strtotime('+1 year');
        #展示视图
        //return view('home/test/test3', ['date' => $date, 'day' => $day]); //或 return view('home.test.test3')
        #Compact函数，是php内置函数跟laravel框架没有关系。
        #作用主要是用于打包数组的。语法: compact(变量名1;变量名2...);
        return view('home/test/test3', compact('date', 'day', 'time'));
    }
    #循环标签
    public function test4()
    {
        //查询数据
        $data = DB::table('member')->get();
        //获取今天的星期数字
        $day = date('N');
        //展示视图，传递数据
        return view('home/test/test4', compact('data', 'day'));
    }
    #模板的继承
    public function test5()
    {
        return view('home/test/test5');
    }
    #展示基础的表单
    public function test6()
    {
        return view('home/test/test6');
    }
    #处理请求
    public function test7()
    {
        return '提交成功';
    }
    /*      模型增删改查 */
    #添加操作
    /* public function test8()
    {
        #    AR模式 
        //实例化模型，将表和类映射起来
        $model = new Member();
        //给属性赋值,将字段与类的属性映射起来
        $model->name = '张三';
        $model->age = '28';
        $model->email = 'zhangsan@qq.com';
        //去做具体操作，将记录映射到实例
        $result = $model->save();
        dd($result);
    } */
    public function test8(Request $request)
    {
        #  方法二
        //实例化模型，将表和类映射起来
        //$model = new Member();
        //添加操作
        $result = Member::create($request->all());
        dd($result);
    }
    public function test12()
    {
        return view('home/test/test12');
    }
    #查询操作
    public function test9()
    {
        //查询指定主键的记录 以数组显示 toArry
        //$data = Member::find(4)->toArray();
        //查询符合条件的第一条数据
        //$data = Member::where("id", '>', 4)->first();
        //all方法 查询所有 且不能加任何条件  get方法可以加条件
        $data = Member::all();
        dd($data);
    }
    #修改操作
    public function test10()
    {
        /* AR模式的修改操作 */
        /* $data = Member::find(7);
        //赋值属性（需要修改的字段赋值）
        $data->email = '111111111@qq.com';
        //实例映射到记录
        $result = $data->save(); */

        /* 使用update方法进行更新 */
        $result = Member::where('id', '7')->update(['age' => '70']);
        dd($result);
    }
    #删除操作
    public function test11()
    {
        //获取需要删除的对象  delete()删除
        $data = Member::find(4);
        dd($data->delete());
    }
    #自动验证
    public function test13(Request $request)
    {
        //判断请求类型 
        //echo Input::method();
        if (Input::method() == 'POST') {
            //自动验证   $this为当前类
            $this->validate($request, [
                //具体规则  字段=>验证规则1|验证规则2|...  验证规则在手册上
                'name' => 'required|min:2|max:20',
                'age' => 'required|integer|min:1|max:100',
                'email' => 'required|email',
                'captcha' => 'required|captcha'
            ]); // composer require caouecs/laravel-lang:~4.0 安装翻译依赖
            //把zh-CN中文包 放到 resources/lang文件下
            //在config/app.php文件下把 'lacale'=>'en'  改为 'locale' => 'zh-CN'
            echo '123123';
        } else {
            //展示视图
            return view('home/test/test13');
        }
    }
    #图片上传到文件 存路径到数据库
    public function test14(Request $request)
    {
        if (Input::method() == 'POST') {
            //上传 判断文件是否正常
            if ($request->hasFile('avatar') && $request->file('avatar')->isValid()) {
                //上传到uploads目录  getClientOriginalExtension()文件后缀
                $path = md5(time() . rand(100000, 99999)) . '.' . $request->file('avatar')->getClientOriginalExtension();
                $request->file('avatar')->move('./uploads', $path);
                //获取全部的数据
                $data = $request->all();
                //将路径添加到数组中
                $data['avatar'] = './uploads/' . $path;
                $result = Member::create($data);
                //判断是否成功
                if ($request) {
                    return redirect('/');
                }
                // dd($result);
            }
        } else {
            //展示视图
            return view('home/test/test14');
        }
    }
    #数据分页
    public function test15()
    {
        //查询数据  Model:paginate(每页显示的记录数)
        //同样，paginate 和get一样，支持使用where以及orderBy等辅助查询的方法。
        $data = Member::paginate(1);
        //展示视图并且传递数据 compact()传递值到页面
        return view('home/test/test15', compact('data'));
    }
    #AJAX页面展示
    public function test16()
    {
        return view('home/test/test16');
    }
    #AJAX页面展示
    public function test17()
    {
        //查询数据
        $data = Member::all();
        //json格式
        return json_encode($data, true); //原生函数
        //return response()->json($data);
    }
    #Session方法储存 会话控制
    public function test18()
    {
        //Session存储一个变量
        Session::put('name', '张三');
        //获取存储值
        echo session::get('name');
        //Session中获取一个变量或返回一个默认值（如果变量不存在）
        // dd(Session::get('gender', '保密'));
        //Session 中获取所有变量
        //dd(Session::all());
        //检查一个变量是否在Session中存在
        dd(session::has('name'));
        // Session 删除一个变量
        Session::forget('name');
        //Session中删除所有变量
        Session::flush();
    }
    #缓存操作 add/put、get、has 、forget、flush、remember
    public function test19()
    {
        //如果存在同名则覆盖 Cache::put('存值名', '值', 储存分钟);
        Cache::put('class', '你好', 10);
        //如果存在同名则不添加 Cache::add('存值名', '值', 储存分钟);
        Cache::add('class', '你好', 10);
        Cache::add('key', '1', 10);
        //永久储存  Cache::forever('存值名', '值');
        Cache::forever('user', '哈喽');
        //获取指定的值
        echo  Cache::get('user');
        //获取指定的值，如果不存在，则使用默认值替换
        echo Cache::get('sddsdsd', '这个假话很懒，什么也没留下...');
        //通过回调函数的方式来返回默认值
        echo Cache::get('tiem', function () {
            return date('Y-m-d H:i:s', time());
        });
        //判断某个值是否存在
        var_dump(Cache::has('tiem'));
        //使用pull实现一次性存储 (获取后删除)
        var_dump(Cache::pull('tiem'));
        //直接删除一个值
        Cache::forget('tiem');
        //直接删除所有缓存值
        // Cache::flush();
        //递增或递减储存值
        //echo Cache::increment('key', 10);
        echo Cache::decrement('key', 10);
        //设置默认时间
        $tiem = Cache::remember('time', 100, function () {
            return date('Y-m-d H:i:s', time());
        });
        var_dump(Cache::has('tiem'));
        dd($tiem);
        //永久存储
        $date = Cache::rememberForever('date', function () {
            return date('Y-m-d H:i:s', time());
        });
        dd($date);
    }
    #联表查询
    public function test20()
    {
        //原始的sgl语句: select t1.id,t1.article_name,t2.author_name from article as t1 left join author as t2 on t1.author_id = t2.id;
        //查询
        $data = DB::table('article as t1')->select(
            't1.id',
            't1.article_name',
            't2.author_name',
        )->leftJoin('author as t2', 't1.author_id', '=', 't2.id')->get();
        dd($data);
    }
    #联表查询模型 一对一
    public function test21()
    {
        //查询数据
        $data = \App\Home\Article::get();
        //循环展示
        foreach ($data as $key => $value) {
            echo $value->id . '&emsp;' . $value->article_name . '&emsp;' . $value->author->author_name . '<br/>';
        }
    }
    #联表查询模型 一对多
    public function test22()
    {
        //查询数据
        $data = \App\Home\Article::get();
        //循环输出
        foreach ($data as $key => $value) {
            echo "当前的文章名称为：" . $value->article_name . '.旗下有的评论为：<br/>';
            //获取当前文章下的全部评论
            foreach ($value->comment as $k => $val) {
                echo '&emsp;' . $val->comment . '<br/>';
            }
        }
    }
    #联表查询模型 多对多
    public function test23()
    {
        //查询数据
        $data = \App\Home\Article::get();
        //循环输出
        foreach ($data as $key => $value) {
            echo "当前的文章名称为：" . $value->article_name . '.旗下有的评论为：<br/>';
            //获取全部关键词
            foreach ($value->keyword as $k => $val) {
                echo '&emsp;' . $val->keyword . '<br/>';
            }
        }
    }
}
/* Input: get(参数的名字，'如果参数没有被传递使用该默认值)
Input:ll():获取所有的用户的输入
Input:get("):获取单个的用户的输入
Input:only([ ]):获取指定几个用户的输入
Input:except([ ]):获取指定几个用户的输入以外的所有的参数
Input: :has('name') :判断某个输入的参数是否存在
*/
